<?php


/**
 * Notes: 库位的一些特性
 * PROJECT_NAME : ERP v1.8 重构erp
 * User: 夏鱼儿<397072174@qq.com>
 * Date: 2024/4/7
 * Time: 14:28
 */

namespace app\service\traits;

trait Storage
{
    /**
     * 获取下一个库位首位字母的名称   库位码生成逻辑1：A-001-01
     * 1.第一位：行用字母代替从A、B、C、D、.....Z、AA、AB，以此类推，第一位代表库区中第一行；
     * 2.第二位：三个阿拉伯数字，从001、002、....以此类推，第二位代表第X列的第X个货架；
     * 3.第三位：两个阿拉伯数字，从01、02、....一此类推，第三位代表第X列中第X个货架的第X层；
     * @param string $currentVariable
     * @return string
     */
    public function getNextVariable(string $currentVariable): string
    {
        // 转换为大写字母，确保输入始终为大写字母
        $currentVariable = strtoupper($currentVariable);

        // 计算当前变量长度
        $length = strlen($currentVariable);

        // 初始化一个数组，存储每个字母的索引值
        $indices = [];
        for ($i = 0; $i < $length; $i++) {
            $indices[] = ord($currentVariable[$i]) - ord('A');
        }

        // 从最后一位开始递增
        for ($i = $length - 1; $i >= 0; $i--) {
            if ($indices[$i] < 25) {
                // 如果当前位的索引值小于25，则直接加1
                $indices[$i]++;
                break;
            } else {
                // 如果当前位的索引值为25，则变为0，并且进位到前一位
                $indices[$i] = 0;
                if ($i == 0) {
                    // 如果是第一位，则需要在数组前面插入一个新的索引0
                    array_unshift($indices, 0);
                    break;
                }
            }
        }

        // 根据索引值重新构建变量字符串
        $result = '';
        foreach ($indices as $index) {
            $result .= chr($index + ord('A'));
        }

        return $result;
    }
}